package cn.org.farseer.sweetftp.manager.site;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import cn.org.farseer.sweetftp.core.persistent.IPersistent;
import cn.org.farseer.sweetftp.core.persistent.XmlPersistentable;
import cn.org.farseer.sweetftp.core.support.CustomService;
import cn.org.farseer.sweetftp.core.support.IIDGenerator;

/**
 * 作者 : [Farseer.org] 简洋  —  2009-7-28
 * 
 * 项目 : [Farseer.org] SweetFTP
 */
@CustomService(ISiteManager.class)
public class SiteManagerImpl implements ISiteManager
{
	private Map<String,SiteGroup> siteGroupMap = new Hashtable<String, SiteGroup>();
	private static final String SAVE_XML_NAME = "FarseeR_SweetFTP_SiteGroup.xml";
	private XmlPersistentable persistentable  = new XmlPersistentable(SAVE_XML_NAME);
	private IIDGenerator generator;
	
	
	@Resource(type=IIDGenerator.class)
	public void setGenerator(IIDGenerator generator)
	{
		this.generator = generator;
	}

	/**
	 * 得到所有的站点组。
	 * @return
	 */
	public List<SiteGroup> getAllSiteGroup()
	{
		return new ArrayList<SiteGroup>(siteGroupMap.values());
	}

	/**
	 * 得到所有的站点。
	 * @return
	 */
	public List<Site> getAllSite()
	{
		List<Site> result = new ArrayList<Site>();
		for (Iterator<SiteGroup> iterator = siteGroupMap.values().iterator(); iterator.hasNext();)
		{
			SiteGroup group = (SiteGroup) iterator.next();
			result.addAll(group.getSites().values());
		}
		return result;
	}
	
	/**
	 * 根据站点组得到站点。
	 * @param group
	 * @return
	 */
	public List<Site> getSiteBySiteGroup(SiteGroup group)
	{
		List<Site> result = new ArrayList<Site>();
		if(group.getSites() != null)
		{
			result.addAll(group.getSites().values());
			return result;
		}
		if(siteGroupMap.get(group.getId()) != null)
		{
			result.addAll(this.siteGroupMap.get(group.getId()).getSites().values());
			return result;
		}
		return null;
	}
	
	/**
	 * 创建一个站点组。
	 * @param group 站点组对象
	 * @return
	 */
	public SiteGroup createSiteGroup(SiteGroup group)
	{
		String id = generator.generatStringId(null);
		group.setId(id);
		this.siteGroupMap.put(id, group);
		return group;
	}
	
	/**
	 * 创建一个站点组。
	 * @param name 站点组名称
	 * @param note  站点组说明
	 * @return
	 */
	public SiteGroup createSiteGroup(String name,String note)
	{
		SiteGroup group = new SiteGroup();
		group.setName(name);
		group.setNote(note);
		String id = generator.generatStringId(null);
		group.setId(id);
		this.siteGroupMap.put(id, group);
		return group;
	}
	
	/**
	 * 创建一个站点。
	 * @param site
	 * @return
	 */
	public Site createSite(Site site)
	{
		String id = generator.generatStringId(null);
		site.setId(id);
		String groupId = site.getSiteGroup().getId();
		SiteGroup group =	this.siteGroupMap.get(groupId);
		site.setSiteGroup(group);
		group.getSites().put(id,site);
		return site;
	}
	
	/**
	 * 创建一个站点。放入指定的站点组。
	 * @param name
	 * @param url
	 * @param username
	 * @param password
	 * @param port
	 * @param note
	 * @param siteGroup 如果传null，放到默认站点组。
	 * @return
	 */
	public Site createSite(String name,String url,String username,String password,String port,String note,SiteGroup siteGroup)
	{
		Site site = new Site(name,url,username,password,port,note,siteGroup);
		String id = generator.generatStringId(null);
		site.setId(id);
		this.siteGroupMap.get(siteGroup.getId()).getSites().put(id,site);
		return site;
	}
	

	
	/**
	 * 修改站点组信息。
	 * @param siteGroup
	 * @return
	 */
	public SiteGroup editSiteGroup(SiteGroup siteGroup)
	{
		this.siteGroupMap.put(siteGroup.getId(), siteGroup);
		return siteGroup;
	}
	
	/**
	 * 修改站点组信息。
	 * @param groupId
	 * @param name
	 * @param note
	 * @return
	 */
	public SiteGroup editSiteGroup(String groupId,String name,String note)
	{
		SiteGroup group = this.siteGroupMap.get(groupId);
		group.setName(name);
		group.setNote(note);
		this.siteGroupMap.put(groupId, group);
		return group;
	}
	
	/**
	 * 修改站点信息。
	 * @param site
	 * @return
	 */
	public Site editSite(Site site)
	{
		site.getSiteGroup().getSites().put(site.getId(),site);
		return site;
	}
	
	
	/**
	 * 修改站点信息。	
	 * @param id	
	 * @param name
	 * @param url
	 * @param username
	 * @param password
	 * @param port
	 * @param note
	 * @param siteGroup 
	 * @return
	 */
	public Site editSite(String id,String name,String url,String username,String password,String port,String note,SiteGroup siteGroup)
	{
		Site site = this.siteGroupMap.get(siteGroup.getId()).getSites().get(id);
		site.setName(name);
		site.setUrl(url);
		site.setUsername(username);
		site.setPassword(password);
		site.setPort(port);
		site.setNote(note);
		this.siteGroupMap.get(siteGroup.getId()).getSites().put(id, site);
		return site;
	}
	
	/**
	 * 删除站点组。
	 * @param siteGroup
	 * @return
	 */
	public boolean deleteSiteGroup(SiteGroup siteGroup)
	{
		this.siteGroupMap.remove(siteGroup.getId());
		return true;
	}
	
	/**
	 * 根据唯一标识删除站点组。
	 * @param id
	 * @return
	 */
	public boolean deleteSiteGroup(String id)
	{
		this.siteGroupMap.remove(id);
		return true;
	}
	
	/**
	 * 删除站点。
	 * @param site
	 * @return
	 */
	public boolean deleteSite(Site site)
	{
		this.siteGroupMap.get(site.getSiteGroup().getId()).getSites().remove(site.getId());
		return true;
	}
	

	/**
	 * 加载数据的接口。
	 * 可从硬盘上加保存着数据的文件中将数据加载出来。
	 * @param persistent
	 */
	public void load(IPersistent persistent)
	{
		List groupSites = persistent.load(persistentable);
		for (Iterator<SiteGroup> iterator = groupSites.iterator(); iterator.hasNext();)
		{
			SiteGroup siteGroup =iterator.next();
			if(siteGroup.getSites() != null)
			{
				for (Iterator<Site> iterator2 = siteGroup.getSites().values().iterator(); iterator2
						.hasNext();)
				{
					Site site =  iterator2.next();
					site.setSiteGroup(siteGroup);
				}
			}
			this.siteGroupMap.put(siteGroup.getId(), siteGroup);
		}		
	}
	
	
	public void persistent(IPersistent persistent)
	{
		persistent.persistent(new ArrayList(this.siteGroupMap.values()), persistentable);
	}
}
